import {
  Controller,
  Get,
  Post,
  Body,
  Patch,
  Param,
  Delete,
  Query,
  UseGuards,
  HttpException,
  HttpStatus,
} from '@nestjs/common';
import {
  ApiTags,
  ApiOperation,
  ApiResponse,
  ApiParam,
  ApiQuery,
  ApiBody,
  ApiBearerAuth,
} from '@nestjs/swagger';
import { WebmenusService } from './webmenus.service';
import { CreateWebmenuDto } from './dto/create-webmenu.dto';
import { UpdateWebmenuDto } from './dto/update-webmenu.dto';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
import { Public } from 'src/decorations/public.decorator';

@ApiTags('Web菜单管理')
@Controller('webmenus')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
export class WebmenusController {
  constructor(private readonly webmenusService: WebmenusService) { }

  /**
   * 创建新的Web菜单
   * @param createWebmenuDto 创建菜单的数据传输对象
   * @returns 创建的菜单对象
   */
  @Post()
  @ApiOperation({ summary: '创建Web菜单', description: '创建一个新的Web菜单项' })
  @ApiBody({ type: CreateWebmenuDto, description: '菜单创建数据' })
  @ApiResponse({ status: 201, description: '菜单创建成功' })
  @ApiResponse({ status: 400, description: '请求参数错误' })
  @ApiResponse({ status: 401, description: '未授权访问' })
  create(@Body() createWebmenuDto: CreateWebmenuDto) {
    return this.webmenusService.create(createWebmenuDto);
  }

  /**
   * 获取所有Web菜单列表（分页）
   * @param pageNum 页码
   * @param pageSize 每页数量
   * @param status 菜单状态筛选
   * @returns 菜单列表和分页信息
   */
  @Get()
  @ApiOperation({ summary: '获取Web菜单列表', description: '分页获取Web菜单列表' })
  @ApiQuery({ name: 'pageNum', required: false, description: '页码，默认为1' })
  @ApiQuery({ name: 'pageSize', required: false, description: '每页数量，默认为10' })
  @ApiQuery({ name: 'status', required: false, description: '菜单状态筛选，1正常 2停用' })
  @ApiQuery({ name: 'name', required: false, description: '菜单名称模糊查询' })
  @ApiQuery({ name: 'modelType', required: false, description: '菜单类型筛选，page单页、list列表页、category分类' })
  @ApiResponse({ status: 200, description: '获取菜单列表成功' })
  @ApiResponse({ status: 401, description: '未授权访问' })
  findAll(
    @Query('pageNum') pageNum?: string,
    @Query('pageSize') pageSize?: string,
    @Query('status') status?: string,
    @Query('name') name?: string,
    @Query('modelType') modelType?: string,
  ) {
    const pageNumValue = pageNum ? parseInt(pageNum, 10) : 1;
    const pageSizeValue = pageSize ? parseInt(pageSize, 10) : 1000;
    const statusNum = status ? parseInt(status, 10) : undefined;

    return this.webmenusService.findAll(pageNumValue, pageSizeValue, statusNum, name, modelType);
  }

  /**
   * 获取菜单树形结构
   * @returns 树形菜单结构
   */
  @Get('tree')
  @ApiOperation({ summary: '获取菜单树形结构', description: '获取完整的菜单树形结构' })
  @ApiResponse({ status: 200, description: '获取菜单树成功' })
  @Public()
  getMenuTree() {
    return this.webmenusService.getMenuTree();
  }

  /**
   * 根据菜单编码获取Web菜单
   * @param code 菜单编码
   * @returns 菜单对象
   */
  @Get('code/:code')
  @ApiOperation({ summary: '根据编码获取菜单', description: '根据菜单编码获取单个菜单信息' })
  @ApiParam({ name: 'code', description: '菜单编码' })
  @ApiResponse({ status: 200, description: '获取菜单成功' })
  @ApiResponse({ status: 404, description: '菜单未找到' })
  @Public()
  findByCode(@Param('code') code: string) {
    return this.webmenusService.findByCode(code);
  }

  /**
   * 根据父菜单编码获取子菜单列表
   * @param parentCode 父菜单编码
   * @returns 子菜单列表
   */
  @Get('parenttree/:parentCode')
  @Public()
  @ApiOperation({ summary: '获取子菜单列表', description: '根据父菜单编码获取子菜单列表' })
  @ApiParam({ name: 'parentCode', description: '父菜单编码' })
  @ApiResponse({ status: 200, description: '获取子菜单列表成功' })
  @ApiResponse({ status: 401, description: '未授权访问' })
  findByParentCode(@Param('parentCode') parentCode: string) {
    return this.webmenusService.findByParentCode(parentCode);
  }

  /**
   * 根据模型类型获取菜单列表
   * @param modelType 模型类型
   * @param pageNum 页码
   * @param pageSize 每页数量
   * @param status 菜单状态筛选
   * @returns 菜单列表和分页信息
   */
  @Get('modelType/:modelType')
  @ApiOperation({ summary: '根据模型类型获取菜单列表', description: '根据模型类型分页获取菜单列表' })
  @ApiParam({ name: 'modelType', description: '模型类型，如：page、category' })
  @ApiQuery({ name: 'pageNum', required: false, description: '页码，默认为1' })
  @ApiQuery({ name: 'pageSize', required: false, description: '每页数量，默认为10' })
  @ApiQuery({ name: 'status', required: false, description: '菜单状态筛选，1正常 2停用' })
  @ApiResponse({ status: 200, description: '获取菜单列表成功' })
  @ApiResponse({ status: 401, description: '未授权访问' })
  findByModelType(
    @Param('modelType') modelType: string,
    @Query('pageNum') pageNum?: string,
    @Query('pageSize') pageSize?: string,
    @Query('status') status?: string,
  ) {
    const pageNumValue = pageNum ? parseInt(pageNum, 10) : 1;
    const pageSizeValue = pageSize ? parseInt(pageSize, 10) : 10;
    const statusNum = status ? parseInt(status, 10) : undefined;

    return this.webmenusService.findByModelType(modelType, pageNumValue, pageSizeValue, statusNum);
  }

  /**
   * 根据模型类型获取所有菜单列表（不分页）
   * @param modelType 模型类型
   * @param status 菜单状态筛选
   * @returns 菜单列表
   */
  @Get('modelType/:modelType/all')
  @ApiOperation({ summary: '根据模型类型获取所有菜单列表', description: '根据模型类型获取所有菜单列表，不分页' })
  @ApiParam({ name: 'modelType', description: '模型类型，如：page、category' })
  @ApiQuery({ name: 'status', required: false, description: '菜单状态筛选，1正常 2停用' })
  @ApiResponse({ status: 200, description: '获取菜单列表成功' })
  @ApiResponse({ status: 401, description: '未授权访问' })
  findAllByModelType(
    @Param('modelType') modelType: string,
    @Query('status') status?: string,
  ) {
    const statusNum = status ? parseInt(status, 10) : undefined;

    return this.webmenusService.findAllByModelType(modelType, statusNum);
  }

  /**
   * 根据模型ID获取菜单
   * @param modelId 模型ID
   * @returns 菜单对象
   */
  @Get('modelId/:modelId')
  @Public()
  @ApiOperation({ summary: '根据模型ID获取菜单', description: '根据模型ID获取对应的菜单信息' })
  @ApiParam({ name: 'modelId', description: '模型ID' })
  @ApiResponse({ status: 200, description: '获取菜单成功' })
  @ApiResponse({ status: 404, description: '菜单未找到' })
  @ApiResponse({ status: 401, description: '未授权访问' })
  findByModelId(@Param('modelId') modelId: string) {
    return this.webmenusService.findByModelId(modelId);
  }

  /**
   * 根据ID获取单个Web菜单
   * @param id 菜单ID
   * @returns 菜单对象
   */
  @Get(':id')
  @ApiOperation({ summary: '获取单个菜单', description: '根据ID获取单个菜单详情' })
  @ApiParam({ name: 'id', description: '菜单ID' })
  @ApiResponse({ status: 200, description: '获取菜单成功' })
  @ApiResponse({ status: 404, description: '菜单未找到' })
  @ApiResponse({ status: 401, description: '未授权访问' })
  findOne(@Param('id') id: string) {
    return this.webmenusService.findOne(id);
  }

  /**
   * 更新Web菜单
   * @param id 菜单ID
   * @param updateWebmenuDto 更新菜单的数据传输对象
   * @returns 更新后的菜单对象
   */
  @Patch(':id')
  @ApiOperation({ summary: '更新菜单', description: '根据ID更新菜单信息' })
  @ApiParam({ name: 'id', description: '菜单ID' })
  @ApiBody({ type: UpdateWebmenuDto, description: '菜单更新数据' })
  @ApiResponse({ status: 200, description: '菜单更新成功' })
  @ApiResponse({ status: 404, description: '菜单未找到' })
  @ApiResponse({ status: 400, description: '请求参数错误' })
  @ApiResponse({ status: 401, description: '未授权访问' })
  update(@Param('id') id: string, @Body() updateWebmenuDto: UpdateWebmenuDto) {
    console.log("更新菜单，数据:", updateWebmenuDto);
    return this.webmenusService.update(id, updateWebmenuDto);
  }

  /**
   * 更新菜单状态
   * @param id 菜单ID
   * @param status 新状态
   * @returns 更新后的菜单对象
   */
  @Patch(':id/status')
  @ApiOperation({ summary: '更新菜单状态', description: '更新菜单的启用/停用状态' })
  @ApiParam({ name: 'id', description: '菜单ID' })
  @ApiBody({ schema: { type: 'object', properties: { status: { type: 'number', description: '菜单状态，1正常 2停用' } } } })
  @ApiResponse({ status: 200, description: '状态更新成功' })
  @ApiResponse({ status: 404, description: '菜单未找到' })
  @ApiResponse({ status: 401, description: '未授权访问' })
  updateStatus(@Param('id') id: string, @Body('status') status: number) {
    return this.webmenusService.updateStatus(id, status);
  }

  /**
   * 删除Web菜单
   * @param id 菜单ID
   * @returns 删除结果
   */
  @Delete(':id')
  @ApiOperation({ summary: '删除菜单', description: '根据ID删除菜单' })
  @ApiParam({ name: 'id', description: '菜单ID' })
  @ApiResponse({ status: 200, description: '菜单删除成功' })
  @ApiResponse({ status: 404, description: '菜单未找到' })
  @ApiResponse({ status: 401, description: '未授权访问' })
  async remove(@Param('id') id: string) {
    try {
      return await this.webmenusService.remove(id);
    } catch (error) {
      // 如果是页面文件删除失败，返回更具体的错误信息
      if (error.message && error.message.includes('删除页面文件失败')) {
        throw new HttpException(
          error.message,
          HttpStatus.BAD_REQUEST,
        );
      }
      // 重新抛出其他异常
      throw error;
    }
  }

  /**
   * 批量删除Web菜单
   * @param ids 菜单ID数组
   * @returns 删除结果
   */
  @Delete('batch/remove')
  @ApiOperation({ summary: '批量删除菜单', description: '批量删除多个菜单' })
  @ApiBody({ schema: { type: 'object', properties: { ids: { type: 'array', items: { type: 'string' }, description: '菜单ID数组' } } } })
  @ApiResponse({ status: 200, description: '批量删除成功' })
  @ApiResponse({ status: 401, description: '未授权访问' })
  removeMany(@Body('ids') ids: string[]) {
    return this.webmenusService.removeMany(ids);
  }
}